package com.example.springboot.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Dict;
import com.example.springboot.common.AuthAccess;
import com.example.springboot.common.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * 功能：文件上传下载
 * 作者：刘涵茹
 * 日期：2024/2/22 15:10
 */

@RestController
@RequestMapping("/file")
public class FileController {

    @Value("${ip:localhost}")
    String ip;

    @Value("${server.port}")
    String port;

    private static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";
    //下载头像文件的目录
    private static final String Avatar_PATH = ROOT_PATH + File.separator + "avatars";
    //下载头像文件的目录
    private static final String Opus_PATH = ROOT_PATH + File.separator + "opus";
    //下载参赛作品文件的目录
    private static final String Audit_PATH = ROOT_PATH + File.separator + "audits";
    //下载报名审核文件的目录
    private static final String Content_PATH = ROOT_PATH + File.separator + "contents";
    //下载富文本文件的目录
    @PostMapping("/uploadavatar")//上传头像
    public Result uploadavatar(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename(); //文件的原始名称
        String mainName = FileUtil.mainName(originalFilename); //不包含文件后缀的名称
        String extName = FileUtil.extName(originalFilename);//获取原始文件的后缀,不包含'.'

        if (!FileUtil.exist(Avatar_PATH)) { //如果存储文件路径的父级不存在
            FileUtil.mkdir(Avatar_PATH);//创建该目录
        }
        if (FileUtil.exist(Avatar_PATH + File.separator + originalFilename)) {
            //如果当前上传的文件已经存在,这时就要重命名一个文件
            //(Avatar_PATH + File.separator + originalFilename):存储的文件路径
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
        }
        File saveFile = new File(Avatar_PATH + File.separator + originalFilename);
        file.transferTo(saveFile);//存储文件到本地的磁盘里面
        String url = "http://" + ip + ":" + port + "/file/downloadavatar/" + originalFilename;
        return Result.success(url);//返回文件的链接,该链接由后台提供,用以下载文件的地址
    }

    @PostMapping("/uploadopus")//上传作品
    public Result uploadopus(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename(); //文件的原始名称
        String mainName = FileUtil.mainName(originalFilename); //不包含文件后缀的名称
        String extName = FileUtil.extName(originalFilename);//获取原始文件的后缀,不包含'.'

        if (!FileUtil.exist(Opus_PATH)) { //如果存储文件路径的父级不存在
            FileUtil.mkdir(Opus_PATH);//创建该目录
        }
        if (FileUtil.exist(Opus_PATH + File.separator + originalFilename)) {
            //如果当前上传的文件已经存在,这时就要重命名一个文件
            //(Avatar_PATH + File.separator + originalFilename):存储的文件路径
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
        }
        File saveFile = new File(Opus_PATH + File.separator + originalFilename);
        file.transferTo(saveFile);//存储文件到本地的磁盘里面
        String url = "http://" + ip + ":" + port + "/file/downloadopus/" + originalFilename;
        return Result.success(url);//返回文件的链接,该链接由后台提供,用以下载文件的地址
    }

    @PostMapping("/uploadaudit")//上传审核文件
    public Result uploadaudit(MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename(); //文件的原始名称
        String mainName = FileUtil.mainName(originalFilename); //不包含文件后缀的名称
        String extName = FileUtil.extName(originalFilename);//获取原始文件的后缀,不包含'.'

        if (!FileUtil.exist(Audit_PATH)) { //如果存储文件路径的父级不存在
            FileUtil.mkdir(Audit_PATH);//创建该目录
        }
        if (FileUtil.exist(Audit_PATH + File.separator + originalFilename)) {
            //如果当前上传的文件已经存在,这时就要重命名一个文件
            //(Avatar_PATH + File.separator + originalFilename):存储的文件路径
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
        }
        File saveFile = new File(Audit_PATH + File.separator + originalFilename);
        file.transferTo(saveFile);//存储文件到本地的磁盘里面
        String url = "http://" + ip + ":" + port + "/file/downloadaudit/" + originalFilename;
        return Result.success(url);//返回文件的链接,该链接由后台提供,用以下载文件的地址
    }

    @AuthAccess//下载可以放行权限,上传不行
    @GetMapping("/downloadavatar/{fileName}")//下载头像文件
    public void downloadavatar(@PathVariable String fileName, HttpServletResponse response) throws IOException {
//        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//        附件下载,需要图片下载时可以用这个
//        response.addHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//        预览/默认情况下不用设置,当文件不是图片或pdf(即预览不了)时,会从预览变成下载
        String filePath = Avatar_PATH + File.separator + fileName;//文件路径
        if (!FileUtil.exist(filePath)) {//不存在就返回
            return;
        }
        byte[] bytes = FileUtil.readBytes(filePath);//读取文件
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(bytes); //数组是一个字节数组,也就是文件的字节流
        outputStream.flush();//刷新
        outputStream.close();//关闭文件流,不关闭会很占据服务器的资源
    }

    @AuthAccess//下载可以放行权限,上传不行
    @GetMapping("/downloadopus/{fileName}")//下载作品文件
    public void downloadopus(@PathVariable String fileName, HttpServletResponse response) throws IOException {
//        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//        附件下载,需要图片下载时可以用这个
//        response.addHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//        预览/默认情况下不用设置,当文件不是图片或pdf(即预览不了)时,会从预览变成下载
        String filePath = Opus_PATH + File.separator + fileName;//文件路径
        if (!FileUtil.exist(filePath)) {//不存在就返回
            return;
        }
        byte[] bytes = FileUtil.readBytes(filePath);//读取文件
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(bytes); //数组是一个字节数组,也就是文件的字节流
        outputStream.flush();//刷新
        outputStream.close();//关闭文件流,不关闭会很占据服务器的资源
    }

    @AuthAccess//下载可以放行权限,上传不行
    @GetMapping("/downloadaudit/{fileName}")//下载审核文件
    public void downloadaudit(@PathVariable String fileName, HttpServletResponse response) throws IOException {
//        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//        附件下载,需要图片下载时可以用这个
//        response.addHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName,"UTF-8"));
//        预览/默认情况下不用设置,当文件不是图片或pdf(即预览不了)时,会从预览变成下载
        String filePath = Audit_PATH + File.separator + fileName;//文件路径
        if (!FileUtil.exist(filePath)) {//不存在就返回
            return;
        }
        byte[] bytes = FileUtil.readBytes(filePath);//读取文件
        ServletOutputStream outputStream = response.getOutputStream();
        outputStream.write(bytes); //数组是一个字节数组,也就是文件的字节流
        outputStream.flush();//刷新
        outputStream.close();//关闭文件流,不关闭会很占据服务器的资源
    }

    @PostMapping("/editor/upload")//富文本上传图片
    public Dict editorUpload(@RequestParam MultipartFile file, @RequestParam String type) throws IOException {
        String originalFilename = file.getOriginalFilename(); //文件的原始名称
        String mainName = FileUtil.mainName(originalFilename); //不包含文件后缀的名称
        String extName = FileUtil.extName(originalFilename);//获取原始文件的后缀,不包含'.'

        if (!FileUtil.exist(Content_PATH)) { //如果存储文件路径的父级不存在
            FileUtil.mkdir(Content_PATH);//创建该目录
        }
        if (FileUtil.exist(Content_PATH + File.separator + originalFilename)) {
            //如果当前上传的文件已经存在,这时就要重命名一个文件
            //(Avatar_PATH + File.separator + originalFilename):存储的文件路径
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
        }
        File saveFile = new File(Content_PATH + File.separator + originalFilename);
        file.transferTo(saveFile);//存储文件到本地的磁盘里面
        String url = "http://" + ip + ":" + port + "/file/download/" + originalFilename;
        if ("img".equals(type)){ //上传图片
            return Dict.create().set("errno", 0).set("data", CollUtil.newArrayList(Dict.create().set("url", url)));//返回文件的链接,该链接由后台提供,用以下载文件的地址
        }else if ("video".equals(type)){//上传视频
            return Dict.create().set("errno", 0).set("data", Dict.create().set("url", url));//返回文件的链接,该链接由后台提供,用以下载文件的地址
        }
        return Dict.create().set("errno", 0);//都不是
    }
}
